#include <stdio.h>
#include <type_traits>

int main()
{
    printf("\n=== C++17 style with _v suffix ===\n");
    // C++17 引入了变量模板（_v 后缀），避免使用 ::value
    // 预期结果: 1 (true)
    printf("add_const_v<int>: %d\n", 
        std::is_same_v<const int, std::add_const_t<int>>);
    
    // C++14 引入了类型别名（_t 后缀），避免使用 ::type
    using IntRef = std::add_lvalue_reference_t<int>;  // 代替 add_lvalue_reference<int>::type
    
    printf("\n=== Modern style type traits examples ===\n");
    // 预期结果: 都是 1 (true)
    printf("is_same_v<int&, int&>: %d\n", std::is_same_v<int&, int&>);
    printf("is_const_v<const int>: %d\n", std::is_const_v<const int>);
    printf("is_pointer_v<int*>: %d\n", std::is_pointer_v<int*>);

#ifdef __cpp_lib_concepts  // C++20
    printf("\n=== C++20 style with concepts ===\n");
    // C++20 引入了 concepts，提供更易读的语法
    printf("same_as<int, int>: %d\n", std::same_as<int, int>);
    printf("convertible_to<int, double>: %d\n", std::convertible_to<int, double>);
#endif

    printf("\n=== Modern comparison examples ===\n");
    // C++17 风格
    if constexpr (std::is_same_v<int, int>) {
        printf("Types are same (C++17 style)\n");
    }

#ifdef __cpp_lib_concepts
    // C++20 风格
    if constexpr (std::same_as<int, int>) {
        printf("Types are same (C++20 style)\n");
    }
#endif

    // 使用类型别名简化代码
    using RemoveAllPtr = std::remove_pointer_t<int****>;  // 直接得到 int
    printf("remove_pointer_t<int****> is int: %d\n", 
        std::is_same_v<int, RemoveAllPtr>);

    return 0;
} 